#!/usr/bin/env python
# @FileName :2024-04-08-密码复杂度测试.py
# @Time :2024/4/8 15:40
# @Author :zhenglu


# 判断字符串包括大、小写字母。数字。其他字符，以上四种至少三种
def character_types(passwd:str) -> bool:
    has_lower = False
    has_upper = False
    has_digit = False
    has_other = False

    for char in passwd:
        if char.islower():
            has_lower = True
        elif char.isupper():
            has_upper = True
        elif char.isdigit():
            has_digit = True
        else:
            has_other = True

            # 如果已经找到三种类型的字符，可以提前结束循环
        if has_lower and has_upper and has_digit:
            return True
        if has_lower and has_digit and has_other:
            return True
        if has_upper and has_digit and has_other:
            return True

 # 判断字符串是否有长度超过或等于3的子串重复
def isRepeat(passwd: str) -> bool:
    length = 3
    while length <= len(passwd) // 2:
        for i in range(len(passwd) - length + 1):
            if passwd[i:i+length] in passwd[i+length:]:
                return False  # 如果找到重复的子串，返回False
        length += 1
    return True  # 如果没有找到重复的子串，返回Ture

def passwd_complexity_check(passwd) -> (int,[]):
    flag = 2
    lst = []
    # 长度超过8位 （必须）
    if len(passwd) >8 :
        flag += 1
    else:
        print("重新输入密码")
        lst.append("长度小于8")
        return 2,lst
    # 包括大、小写字母。数字。其他字符，以上四种至少三种
    if character_types(passwd):
        flag += 1
    else:
        lst.append("密码没有由3种以上字符组成")
    # 不能有长度超过或等于3的子串重复
    if isRepeat(passwd):
        flag += 1
    else:
        lst.append("密码有长度超过或等于3的子串重复")

    return flag,lst
    # 密码的评分等级，默认链分，以上条件满足一条加1分
    # 返回密码的评分等级，及时改进的点
    # 如 return 3 ，及要改进的点
    # 如 return 3,["长度小于8","密码没有由3种以上字符组成"]


passwd = input("请输入密码：")
rank,lst = passwd_complexity_check(passwd)
print(rank,lst)